package com.kaikeba.service;

import com.kaikeba.bean.Express;
import com.kaikeba.dao.BaseExpressDao;
import com.kaikeba.dao.impl.ExpressDaoImpl;
import com.kaikeba.exception.DuplicateCodeException;
import com.kaikeba.util.RandomUtil;
import com.kaikeba.util.SMSUtil;

import java.util.List;
import java.util.Map;

public class ExpressService{

    private static ExpressDaoImpl dao = new ExpressDaoImpl();

    /**
     * 用与获取全部快递（总数 + 新增）  代取件快递（总数 + 新增）
     *
     * @return [{size:总数,day :新增},{size: 待取件总数,day :新增}]
     */

    public static List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 用于查询所有快递
     *
     * @param limit      是否分页标记 true：分页
     * @param offset     SQL语句的起始索引
     * @param pageNumber 每一页查询的数量
     * @return
     */

    public static List<Express> findAll(boolean limit, int offset, int pageNumber) {
        return dao.findAll(limit, offset, pageNumber);
    }

    /**
     * 根据快递单号查询快递
     *
     * @param number 单号
     * @return 查询的快递信息，单号不存在时返回null
     */

    public static Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根据快递取件码查询快递
     *
     * @param code 单号
     * @return 查询的快递信息，不存在时返回null
     */

    public static Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根据手机号查询快递
     *
     * @param userPhone
     * @return 查询的快递信息，不存在时返回null
     */

    public static List<Express> findByUserPhone(String userPhone) {
        return dao.findByUserPhone(userPhone);
    }

    /**
     * 根据手机号查询快递
     *
     * @param userPhone
     * @param status
     * @return 查询的快递信息，不存在时返回null
     */

    public static List<Express> findByUserPhoneAndStatus(String userPhone,int status) {
        return dao.findByUserPhoneAndStatus(userPhone,status);
    }

    /**
     * 根据录入人查询录入的快递
     *
     * @param sysPhone
     * @return 查询的快递信息，不存在时返回null
     */

    public static List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * 快递的录入
     *
     * @param e 快递对象
     * @return
     */

    public static boolean insert(Express e) throws DuplicateCodeException {
        // 生成了取件码
        e.setCode(RandomUtil.getCode()+"");
        try {
            boolean flag = dao.insert(e);
            if(flag){
                // 录入成功
                //SMSUtil.send(e.getUserPhone(),e.getCode());
            }
            return flag;
        } catch (DuplicateCodeException duplicateCodeException) {
            return insert(e); // 递归的方式解决取件码重复的问题
        }
    }

    /**
     * 快递修改
     *
     * @param id         要修改的跨地的id
     * @param newExpress 新的快递对象（number,company,username,userPhone）
     * @return
     */

    public static boolean update(int id, Express newExpress) {
        if(newExpress.getUserPhone() != null){ // 表示用户修改了手机号，我们就需要删除之前的快递信息，插入新的快递，重新绑定取件码
            dao.delete(id);
            boolean b = false;
            try {
                 b = insert(newExpress);
            } catch (DuplicateCodeException e) {
                e.printStackTrace();
            }
            return b;

        }else { // 用户未修改手机号
            boolean update = dao.update(id, newExpress);
            Express e = dao.findByNumber(newExpress.getNumber());
            if(newExpress.getStatus() == 1){
                boolean b = updateStatus(e.getCode());
            }
            return update;
        }

    }

    /**
     * 根据快递id 删除快递
     *
     * @param id 要删除的快递id
     * @return
     */

    public static boolean delete(int id) {
        return dao.delete(id);
    }

    /**
     * 更改快递的状态为 1 ，表示取件完成
     *
     * @param code 要修改的快递单号
     * @return
     */

    public static boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }


}
